home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Czech Logic, Card & Gambling Games
/
Logické hry.iso
/
hry
/
Fish Fillets
/
script
/
share
/
prog_goanim.lua
< prev
next >
Wrap
Text File
|
2005-07-16
|
3KB
|
122 lines
-- -----------------------------------------------------------------
-- setanim() and gonanim()
-- -----------------------------------------------------------------
-- Example: setanim(model, "a3d3a4a5a6a7d2a6a5a4a3")
function resetanim(model)
model.anim_delay = 0
model.anim_pos = 1
model.anim_label = 1
end
function endanim(model)
-- returns true for just finished animation
local result = false
if model.anim_pos > string.len(model.anim) and model.anim ~= "" then
result = true
end
return result
end
function setanim(model, anim_string)
resetanim(model)
model.anim = anim_string
end
local function anim_getSymbol(model)
return string.sub(model.anim, model.anim_pos, model.anim_pos)
end
local function anim_incPos(model)
model.anim_pos = model.anim_pos + 1
end
local function anim_var(model)
-- var := \[[a-zA-Z]+\]
local istart, iend, str_var = string.find(model.anim,
"%[(%w+)%]", model.anim_pos)
if istart == nil then
error("SCRIPT_ERROR empty anim_var; anim="..model.anim)
end
return str_var
end
local function anim_number(model)
-- N := -?[0-9]+ | \?N.N
local symbol = anim_getSymbol(model)
if symbol == "?" then
anim_incPos(model)
local int1 = anim_number(model)
anim_incPos(model)
local int2 = anim_number(model)
return randint(int1, int2)
end
local istart, iend, str_number = string.find(model.anim,
"(%-?%d+)", model.anim_pos)
local number = 0
if istart == nil then
print("SCRIPT_WARNING empty number; anim="..model.anim)
else
model.anim_pos = iend + 1
number = tonumber(str_number)
if number == nil then
error("SCRIPT_ERROR bad number; str_number="..str_number)
end
end
return number
end
local function anim_next(model)
-- Process next symbol, uppercase letters are not blocking.
local symbol = "A"
while string.lower(symbol) ~= symbol and model.anim_pos <= string.len(model.anim) do
symbol = anim_getSymbol(model)
anim_incPos(model)
switch(string.lower(symbol)){
["d"] = function()
model.anim_delay = anim_number(model)
if model.anim_delay < 0 then
model.anim_delay = 0
symbol = "D"
end
end,
["a"] = function()
model.afaze = anim_number(model)
end,
["s"] = function()
local var = anim_var(model)
anim_incPos(model)
local value = anim_number(model)
model[var] = value
end,
["l"] = function()
model.anim_label = model.anim_pos
end,
["g"] = function()
model.anim_pos = model.anim_label
end,
["r"] = function()
model.anim_pos = 1
end,
default = function()
error("SCRIPT_ERROR unknown anim symbol; symbol="..symbol.."; pos="..model.anim_pos.."; anim="..model.anim)
end,
}
end
end
function goanim(model)
-- goanim process next anim command
if model.anim_delay > 0 then
model.anim_delay = model.anim_delay - 1
elseif model.anim_pos > string.len(model.anim) then
model.anim = ""
model.anim_pos = 1
else
anim_next(model)
end
end